package com.laolang.pluto.module.sys.logic.impl;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.laolang.pluto.common.consts.GlobalConst;
import com.laolang.pluto.common.core.domain.common.Page;
import com.laolang.pluto.common.logic.impl.BaseLogicImpl;
import com.laolang.pluto.common.persist.entity.BaseEntity;
import com.laolang.pluto.common.util.AssertUtil;
import com.laolang.pluto.module.sys.consts.logic.SysBizCode;
import com.laolang.pluto.module.sys.entity.ProjectBaseInfo;
import com.laolang.pluto.module.sys.logic.ProjectLogic;
import com.laolang.pluto.module.sys.mapstruct.ProjectMapStruct;
import com.laolang.pluto.module.sys.pojo.dto.ProjectEditDto;
import com.laolang.pluto.module.sys.pojo.dto.ProjectListReqDto;
import com.laolang.pluto.module.sys.pojo.vo.ProjectVo;
import com.laolang.pluto.module.sys.service.ProjectBaseInfoService;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

/**
 * @author laolang
 * @date 2021-08-12 04:06
 */
@Slf4j
@RequiredArgsConstructor
@Service
public class ProjectLogicImpl extends BaseLogicImpl implements ProjectLogic {
	private final ProjectBaseInfoService projectBaseInfoService;
	private final ProjectMapStruct projectMapStruct;

	@Override
	public Page<ProjectVo> list(ProjectListReqDto dto) {
		LambdaQueryWrapper<ProjectBaseInfo> wrapper = Wrappers.lambdaQuery();
		if (StrUtil.isNotBlank(dto.getName())) {
			wrapper.like(ProjectBaseInfo::getName, dto.getName());
		}
		return pageInfo2Page(projectBaseInfoService.listPage(dto.getPage(), dto.getSize(), wrapper),
				projectMapStruct::entity2vo);
	}

	@Override
	public ProjectBaseInfo detail(Long id) {
		return assertExist(id);
	}

	@Override
	public void add(ProjectEditDto dto) {
		checkName(dto.getName());
		checkCase(null);
		checkIssue(null);

		ProjectBaseInfo insert = projectMapStruct.editdto2entity(dto);
		insert.setId(null);
		insert.setProjectKey(IdUtil.objectId());
		insert.setCreateBy(GlobalConst.ADMIN_ID);
		projectBaseInfoService.save(insert);
	}

	@Override
	public void edit(ProjectEditDto dto) {
		ProjectBaseInfo entity = assertExist(dto.getId());
		entity.setName(dto.getName());
		entity.setCaseTplId(dto.getCaseTplId());
		entity.setIssueTplId(dto.getIssueTplId());
		entity.setProjectMark(dto.getProjectMark());
		entity.setUrlRepeat(dto.getUrlRepeat());
		entity.setCaseIdCustom(dto.getCaseIdCustom());
		entity.setSceneIdCustom(dto.getSceneIdCustom());
		projectBaseInfoService.updateById(entity);
	}

	@Override
	public void delete(Long id) {
		assertExist(id);
		projectBaseInfoService.removeById(id);
		// TODO 删除项目数据
	}

	/**
	 * 根据 id 断言项目是否存在
	 *
	 * @param id id
	 * @return 项目信息
	 */
	private ProjectBaseInfo assertExist(Long id) {
		ProjectBaseInfo entity = projectBaseInfoService.getById(id);
		AssertUtil.notNull(log, entity, SysBizCode.PROJECT_NOT_EXIST, StrUtil.format("项目不存在:[{}]", id));
		return entity;
	}

	/**
	 * 检查项目名是否重复
	 *
	 * @param name 项目名称
	 */
	private void checkName(String name) {
		checkName(name, null);
	}

	/**
	 * 检查项目名是否重复
	 *
	 * @param name 项目名称
	 * @param id   项目id
	 */
	private void checkName(String name, Long id) {
		LambdaQueryWrapper<ProjectBaseInfo> wrapper = Wrappers.lambdaQuery();
		wrapper.eq(ProjectBaseInfo::getName, name);
		if (null != id) {
			wrapper.ne(BaseEntity::getId, id);
		}
		AssertUtil.isTrue(log, 0 == projectBaseInfoService.count(wrapper), SysBizCode.PROJECT_NAME_EXIST,
				StrUtil.format("新增项目名:[{}]已存在", name));
	}

	/**
	 * TODO 检查 issue 模板是否存在
	 *
	 * @param id issue id
	 */
	private void checkIssue(Long id) {

	}

	/**
	 * TODO 检查 case 模板是否存在
	 *
	 * @param id case id
	 */
	private void checkCase(Long id) {

	}
}
